﻿////#include <stdio.h>
////
////int  main()
////{
////	
////	int b = 017;//十进制字面量必须以非零数字开头，而八进制字面量必须以0开头，十六进制字面量具有0x和0X
////	//printf("%x\n,a");
////	printf("%X\n",b);//  f   八进制017表示是15，用16进制表示就是f,
////	//%x表示小写十六进制，大写泽反之
////
////	return 0;
////}
////在C语言中，% X 是一个格式说明符，用于以十六进制形式输出无符号整数，并且使用大写字母（A - F）来表示十六进制数字。具体来说：
////
////% X 用于 printf 和 scanf 等函数中，指定输出或输入的数据格式为十六进制。
////当使用 % X 输出整数时，整数会被转换为十六进制格式，并且字母部分会使用大写形式（A - F）。
////例如，如果有一个整数 num 的值为 255，使用 printf("num的十六进制表示为：%X", num); 输出的结果将是 FF。
////以下是我搜索到的资料的引用：
////
////	: % X 表示无符号16进制数字，使用大写 ABCDEF。
////	: % X 格式说明符用于以十六进制表示法打印无符号 int 参数，字母部分使用大写。
////	: % X 以无符号的十六进制形式输出整数，字母部分使用大写。
////	: % X 读入十六进制整数，输出时使用大写。
////	: % X 表示以十六进制形式显示值，使用大写字母（A - F）。
////	综上所述， % X 在C语言中用于以大写的十六进制形式输出无符号整数。
////
////
////
////                  在 C 语言中，你可以通过以下方式输入一个字符并打印其 ASCII 码值：
////#include <stdio.h>
////
////int main()
////{
////    char ch;
////    printf("请输入一个字符: ");
////    scanf("%c", &ch); // 读取用户输入的字符
////    printf("字符 '%c' 的ASCII码值是: %d\n", ch, ch);
////    return 0;
////}
////
////int main()
////{
////	char  a = 'x';
////	printf("%d", a);
////
////	return 0;
////}
//////      在 C 语言中，字母 'x'（小写 x）的 ASCII 码值是：
////
////int main() 
////{
////    char ch = 'x';
////    printf("'x'的ASCII码值（十进制）: %d\n", ch);   // 120
////    printf("'x'的ASCII码值（十六进制）: %X\n", ch); // 78
////    return 0;
////}
////
////         !!!!!!!!!!!!!!!!                              \t                              !!!!!!!!!!!!!!!!
////
////在编程和文本处理中，\t是一个转义字符（escape character），表示水平制表符（horizontal tab），其作用相当于键盘上的Tab键。以下是详细解释：
////
//// 功能：
////视觉效果：在输出时会插入一段空白间距（通常等于4或8个空格宽度，具体取决于环境设置）。
////逻辑意义：用于对齐文本或数据的分列显示。
//// 例如：
////Dec     Hex     Char    Binary          Dec     Hex     Char    Binary
////
////
////
////
////
////  ！！！！！                        小生不才，想打印出ASCII码表，奈何却实力不足，只能求助于秘塔了！
////    
////
////
////
////
//// 
////                                         ASCII 码表        
////
////#include <ctype.h> // for isprint()
////
////// 将整数转换为8位二进制字符串
////void intToBinary(int num, char* binaryStr)
////{
////    for (int i = 7; i >= 0; i--)
////    {
////        binaryStr[7 - i] = (num & (1 << i)) ? '1' : '0';
////    }
////    binaryStr[8] = '\0';
////}
////
////int main() 
////{
////    printf("ASCII Table (0-127)\n"); 吗
////    printf("Dec\tHex\tChar\tBinary\t\tDec\tHex\tChar\tBinary\n");
////    printf("----------------------------------------------------------------\n");
////
////    char binary[9];
////
////    for (int i = 0; i < 128; i++)
////    {
////        intToBinary(i, binary);
////
////        // 左半部分 (0-63)
////        if (i < 64)
////        {
////            printf("%3d\t%02X\t", i, i);
////            if (isprint(i) && !isspace(i)) 
////            {
////                printf("%c", i);
////            }
////            else if (i == '\n')
////            {
////                printf("\\n");
////            }
////            else if (i == '\t') 
////            {
////                printf("\\t");
////            }
////            else
////            {
////                printf(" ");
////            }
////            printf("\t%s", binary);
////
////            // 右半部分 (64-127)
////            int j = i + 64;
////            if (j < 128) 
////            {
////                intToBinary(j, binary);
////                printf("\t%3d\t%02X\t", j, j);
////                if (isprint(j) && !isspace(j)) 
////                {
////                    printf("%c", j);
////                }
////                else if (j == '\n') 
////                {
////                    printf("\\n");
////                }
////                else if (j == '\t') 
////                {
////                    printf("\\t");
////                }
////                else 
////                {
////                    printf(" ");
////                }
////                printf("\t%s", binary);
////            }
////            printf("\n");
////        }
////    }
////
////    return 0;
////}
////
//// !!!!!!!!!!!!!!!           补码  源码  反码               ！！！！！！！！！！！
////
//// 首位表示的是  ！= 符号，反码时不变不改变
////int main()
////{
////
////    int a = -10;//ff ff ff f6
////
////                     //补码是：100000000/00000000/00000000/00001010
////                     //反码是：111111111/11111111/11111111/11110101
////                     //补码是：111111111/11111111/11111111/11110110    补码=反码+1
////    int b = 10;
////                          //00000000000000000000000000001010 -- 原码
////	                      //00000000000000000000000000001010 -- 反码
////	                      //00000000000000000000000000001010 -- 补码
////    return 0;
////}
////
////int main()
////{
////	1 - 1;
////	假设原码计算
////	1 + (-1)
////	00000000000000000000000000000001   正整数和无符号整数（应该）源码，补码，反码一致
////	10000000000000000000000000000001   -1的源码
////	10000000000000000000000000000010   计算结果:-2
////
////	假设补码计算
////	00000000000000000000000000000001  补码（1）
////	10000000000000000000000000000001
////	11111111111111111111111111111110  反码（-1）
////	11111111111111111111111111111111  补码（-1）
////	
////	11111111111111111111111111111111   两个相加运算
////	00000000000000000000000000000001  
////	00000000000000000000000000000000 --- 0    （符号位改变了）！
////	/*return 0;
////}*/
////
////
////   ！！！！！！！！！！               位移操作符         ！！！！！！！！！！！1
////1.左位移操作符
////  左边抛弃，右边补零
////	int main()
////	{
////		int count = 10; //原码 = 补码 = 反码 = 00000000 00000000 00000000 00001010
////		                //左边抛弃，右边补零   00000000 00000000 00000000 01010000  80=  64 + 16
////		int count2 = count << 3;
////		printf("%d\n", count2);//结果是 80
////		
////		return 0;
////	 }
////2.右位移操作符
////（1） 逻辑右移：左边⽤0填充，右边丢弃
////（2） 算术右移：左边⽤原该值的符号位填充，右边丢弃 ！！！（默认）
////
////int main()
////{
////	int count3 = -5;  
////    //原码 10000000 00000000 000000000 00000101
////	//反码 11111111 11111111 111111111 11111010
////	//补码 11111111 11111111 111111111 11111011
////
//// //位移后  补码  10001111 11111111 111111111 11111111 
//////	       反码  10001111 11111111 111111111 11111110
////  //       原码  11110000 00000000 000000000 00000001 
////	
////	int count4 = count3 >> 3;
////	printf("%d", count4);// -1
////	return 0;
////}
////
////算术右移（Arithmetic Right Shift）的规则：
////符号位填充：
////如果原数的最高位（符号位）是 1（负数），则右移时左边补 1；
////如果原数的最高位是 0（正数），则右移时左边补 0。
////右边丢弃：
////最低位被丢弃
//// 位移操作是在补码上进行
////
////  11111111 11111111 11111111 11111111补码都是1则值为  -1   ！！！
////
////
////
////   警告⚠️：对于移位运算符，不要移动负数位，这个是标准未定义的
////
////
////
////
////
//// !!!!!!!!!!!!!!!!         位操作符：& 、 | 、 ^ 、~            !!!!!!!!!!!!!!!!!!!!
////
////按位与  &
////对应的二进制位上，两个同时为1才为1；只有有0就是0！！！
////
////内存中存储的是补码，但打印出来的是原码
////
////
////int main()
////{
////	int a = -8;
////	int b = 6;
////	int c = a & b;
////	//  -8的原码 10000000 00000000 00000000 00001000
////	//  -8的反码 11111111 11111111 11111111 11110111
////    //  -8的补码 11111111 11111111 11111111 11111000
////	//   6的补码 10000000 00000000 00000000 00000110
////	// 
////	//    按位与 10000000 00000000 00000000 00000000
////	
////	printf("%d\n", c);// 0
////
////	return 0;
////}
////
////按位或 |
////对应的二进制位，进行或运算，只要有1就是1，同时为0才为0
////
////int main()
////{
////	int a = -8;
////	int b = 6;
////	int c = a | b;
////	//  -8的原码 10000000 00000000 00000000 00001000
////	//  -8的反码 11111111 11111111 11111111 11110111
////	//  -8的补码 11111111 11111111 11111111 11111000
////	//   6的补码 10000000 00000000 00000000 00000110
////	// 
////	//    按位或 11111111 11111111 11111111 11111110
////	//运算后反码11111111 11111111 11111111 11111101
////	//运算后原码10000000 00000000 00000000 00000010
////	//    所以结果是 -2
////
////	printf("%d\n", c);// -2
////
////	return 0;
////}
////
////  注意！！！在按位与（&）运算中，包括符号位在内的所有二进制位都会按照“同时为１才为１”的规则进行计算。
////
////
////按位异或：^
////对应的二进制位进行异或操作
////相同为0，相异为1
////int main()
////{
////	int a = -8;
////	int b = 6;
////	int c = a ^ b;
////	  -8的原码 10000000 00000000 00000000 00001000
////	  -8的反码 11111111 11111111 11111111 11110111
////	  -8的补码 11111111 11111111 11111111 11111000
////	   6的补码 00000000 00000000 00000000 00000110
////	 
////	  按位异或  补码11111111 11111111 11111111 11111110
////	运算后      反码01111111 11111111 11111111 11111101      
////	运算后      原码00000000 00000000 00000000 00000010
////	    所以结果是 -2
////
////	printf("%d\n", c);// -2
////
////	return 0;
////}
////
////！！！！！！！！！！！            6. 单⽬操作符          ！！！！！！！！！！！！！！
////单⽬操作符有这些：
//// ！、++、--、 & 、 * 、 + 、 - 、~、sizeof、(类型)
////
////  单⽬操作符的特点是只有⼀个操作数，在单⽬操作符中只有 & 和 * 没有介绍，这2个操作符，我们放在
////学习指针的时候学习。
////
// 180行